﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UtilZ.Dotnet.Ex.ZLog;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// 重新初始化连接
    /// Re initializes the connection.
    /// </summary>
    internal class FtpREINCommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [REIN](Reinitialize,重新初始化) 命令
        * 说明：终止一个用户。
        * 
        * 用法：REIN<CRLF>
        * 参数：无。
        * 例子：
        * SendData "REIN" + “/r/n
        * 
        * 注释：除了允许完成正在进行的传送之外，REIN将刷新所有的I/O和帐号信息。所有参数都被复位到默认设置，控制连接仍然打开。这和用户在刚刚打开控制连接时的状态是一样的。如果后来想要登录，在发送USER命令之前送一条REIN命令。
        * 返回值如下（粗体表示成功）：
        * 120  服务将在nnn分钟后准备好。
        * 220  服务已为新用户准备好。
        * 421  服务不可用，关闭控制连接。
        * 
        * 如果某项服务获知自己即将关闭，会向所有命令做出这个应答。
        * 500  语法错误，无法识别命令。这其中包括命令行过长之类的错误。
        * 502  命令还没有被实现。
        * 
        ************************************************************************************************************/


        public FtpREINCommand()
            : base()
        {

        }



        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.REIN };
        }

        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            //未抓包验证
            //Request: REIN
            //Response: 220 服务已为新用户准备好.


            try
            {
                session.Reset();
                return new FtpCodeResponse(FtpStatusCodes.Code220);
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }
    }

}
